﻿package core;


import java.util.Calendar;


// ====================================== Вывод системных и отладочных сообщений
public class Mess {

// ============================================================= Общие константы
public static final int FROM_UP = 1; // Сообщение "Сверху"
public static final int LOCAL = 0; // Сообщение "Сверху"
public static final int FROM_DOWN = -1; // Сообщение "Снизу"


// ==================================================================== Локально
//private static final int MAX_LENGTH = 1024 * 10; // Максимальная длина лога
private static final int MODULE_LENGTH = 20; // Ширина поля для названия модуля
private static final int DIFF_LENGTH = 7; // Ширина поля разницы во времени
private static final int THREAD_LENGTH = 11; // Ширина поля названия потока


private static long oldTime = System.currentTimeMillis();
private static Calendar cald = Calendar.getInstance();
private static String spaces = "                    ";


//==================================================================== Сообщение
private static void m(String module, String text, Exception exception,
		boolean fErr) {

	long time = System.currentTimeMillis();
	int diff = (int) (time - oldTime);
	oldTime = time;

	StringBuffer outText = new StringBuffer(text.length() + 64);

	// Время
	int h, m, s;

	cald = Calendar.getInstance();

	h = cald.get(Calendar.HOUR_OF_DAY);
	m = cald.get(Calendar.MINUTE);
	s = cald.get(Calendar.SECOND);
	if (h < 10) {
		outText.append('0');
	}
	outText.append(h).append(':');
	if (m < 10) {
		outText.append('0');
	}
	outText.append(m).append(':');
	if (s < 10) {
		outText.append('0');
	}
	outText.append(s);

	// Разница во времени
	outText.append(
			spaces.substring(MODULE_LENGTH
					- (Math.max(1, DIFF_LENGTH - ("" + diff).length())))).append('+')
			.append(diff);


	// Поток
	String tName = Thread.currentThread().getName();
	outText.append(
			spaces.substring(MODULE_LENGTH
					- (Math.max(1, THREAD_LENGTH - tName.length())))).append(tName);

	// Модуль
	outText.append(' ').append(module).append(": ").append(
			spaces.substring(MODULE_LENGTH
					- (Math.max(1, MODULE_LENGTH - module.length()))));

	// Ошибка?
	if (fErr) {
		outText.append("ОШИБКА! ");
	}

	// Текст
	outText.append(text);

	// Исключение
	if (exception != null) {
		outText.append("\n").append(exception.getClass()).append(": ").append(
				exception.getMessage());
	}

	if (!fErr) {
		System.out.println(outText);
	} else {
		if (exception != null) {
			outText.append(" Trace:");
			System.err.println(outText);
			exception.printStackTrace();
		} else {
			System.err.println(outText);
		}
	}

}


public static void m(String module, String text, Exception exception) {

	m(module, text, exception, false);
}


public static void m(String module, String text) {

	m(module, text, null, false);
}


// ========================================================= Сообщение об ошибке
public static void err(String module, String text, Exception exception) {

	m(module, text, exception, true);
}


public static void err(String module, String text) {

	m(module, text, null, true);
}


public static void err(String module, Exception exception) {

	m(module, "Неизвестное исключение", exception, true);
}

}
